package kjhgffdds;

import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;

import java.awt.Color;
import java.awt.TextArea;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Vector;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JList;
import javax.swing.JScrollPane;

public class ChatingClient extends JPanel implements Runnable {

	public   JTextArea textArea = new JTextArea(); // private 와 public 의 반대적인 개념과
													// 차이인데 private는 호출을 하는 범위가
													// 제한이 있고 public는 범위제한으로 문제가
													// 되지 않는다
	private JList list = new JList();
	private ObjectOutputStream send; // ObjectOutputStream 을 send로 받는다
	private ObjectInputStream receive;//ObjectInputStream receive로 받는다.
	private JTextField txtId;// 이거
	private JTextField txtPort;// 이거 두개는 신경써서 지정을 해줘야 한다.. 기본적으로 자동으로 생기는 밑의 텍스트
								// 필드들과 다르게 손이 많이 가는 녀석들이다.
	private JTextField textField;    // UI에서 그려주는 부분
	private JTextField textField_1;  // UI에서 그려주는 부분 
	private JTextField txtUserid;	// UI에서 그려주는 부분
	private JTextField textField_3; // UI에서 그려주는 부분
	private JTextField textField_4; // UI에서 그려주는 부분
	private JTextField textField_5;  // UI 에서 그러주는 부분
	boolean threadFlag = true;   // 들어오는 값이 참이라는 기준일때 thredFlag
	Vector<String> userList = new Vector<String>();

	/**
	 * Create the panel.
	 */
	public ChatingClient() {
		setLayout(null);
		Vector<String> userList = new Vector<String>();

		textField = new JTextField();
		textField.setText("192.168.0.85");
		textField.setBounds(12, 10, 116, 21);
		add(textField);
		textField.setColumns(10);

		textField_1 = new JTextField();
		textField_1.setText("7777");
		textField_1.setBounds(140, 10, 116, 21);
		add(textField_1);
		textField_1.setColumns(10);

		txtUserid = new JTextField();
		txtUserid.setText("UserID");
		txtUserid.setBounds(271, 10, 116, 21);
		add(txtUserid);
		txtUserid.setColumns(10);

		textField_3 = new JTextField();
		textField_3.setBounds(395, 10, 116, 21);
		add(textField_3);
		textField_3.setColumns(10);

		JButton btnNewButton = new JButton("로그인");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				Thread t = new Thread(ChatingClient.this);
				t.start();
			}
		});
		btnNewButton.setBounds(56, 43, 97, 23);
		add(btnNewButton);

		JButton btnNewButton_1 = new JButton("로그 아웃");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				ChatData cd = new ChatData();
				cd.setCommand("logout");
				cd.setMessage("Bye이니라" + "\n");
				cd.setId(txtUserid.getText()); 

				try {
					send.writeObject(cd);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
		btnNewButton_1.setBounds(322, 43, 97, 23);
		add(btnNewButton_1);

		textField_4 = new JTextField();
		textField_4.setBackground(Color.GREEN);
		textField_4.setHorizontalAlignment(SwingConstants.CENTER);
		textField_4.setText("이모티콘");
		textField_4.setBounds(12, 269, 116, 21);
		add(textField_4);
		textField_4.setColumns(10);

		textField_5 = new JTextField();
		textField_5.setBounds(140, 269, 329, 21);
		add(textField_5);
		textField_5.setColumns(10);

		JButton btnDwd = new JButton("전송");
		btnDwd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				try {
					
					ChatData cd = new ChatData();
					
					cd.setCommand("message");
					cd.setMessage(textArea.getText());
					cd.setId(textArea.getText());
					send.writeObject(cd);
					
					
					
					
					
					textArea.append(cd.getMessage() + "\n"); 
					textArea.setText("");
					

				} catch (Exception ex) {

				}

			}
		});
		btnDwd.setBounds(481, 268, 97, 23);
		add(btnDwd);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(35, 68, 185, 183);
		add(scrollPane);

		scrollPane.setViewportView(list);

		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(271, 68, 272, 177);
		add(scrollPane_1);

		scrollPane_1.setViewportView(textArea);

	}

	@Override
	// 오버라이드 상속을 받는 부분이다 Runnable로...
	public void run() {

		try {// try catch 구간.. Exception ex 으로 무시해도 되는 오류 잡는것로 외우고잇단거..
			int port = Integer.parseInt(textField_1.getText()); // 디자인과 맞추는 부분.
																// port라고 지정을
																// 해준것이다 입력값이
																// 나오고 말고 하는
																// 부분들.... 겟은
																// 정보를 불러온다 셋은
																// 입력을 한다....
																// 까먹는다 헷갈리고
			Socket s = new Socket(textField.getText(), port);// 디자인과 맞추는 부분.

			// 여기서는 socket 이라고 사용하는 부분들이 생겻는대... 그냥 외워야 써먹을듯.. 이도저도아니고...

			
			
			
			
			
			
			
			
			OutputStream os = s.getOutputStream();
			 send = new ObjectOutputStream(os);

			InputStream is = s.getInputStream();
			receive = new ObjectInputStream(is);

			
			
			
			
			
			
			
			
			
			
			
			ChatData cd = new ChatData();

			//
			
			// TextArea 와 Field 의 차이점이 벌어지는데 textArea는 append 를 사용을 하고 Field 에서는
			// getText를 사용을 한다..
			cd.setCommand("login");
			cd.setMessage("안녕이니라" + "\n");
			cd.setId(txtUserid.getText()); // 데이터가 보여질 곳을 지정할 위치를 적는것.. 수업떄는
											// USerID 엿지만 나는 txtUserid로디자인이
											// 되어있다.. 위치는 로그아웃의 위 지역

			send.writeObject(cd);

			
			
			
			
			
			
			
			
			
			while (threadFlag) {
				cd = (ChatData) receive.readObject();

				if (cd.getCommand().equals("message")) {
					textArea.append(cd.getMessage() + "\n");
					{
						textArea.append(cd.getId() + "]");

					}

				} else if (cd.getCommand().equals("login")) {
					textArea.append(cd.getId() + "]");

					userList.add(cd.getId());
					list.setListData(userList);
				} else if (cd.getCommand().equals("logout")) {
					userList.remove(cd.getId());
					list.setListData(userList);

				} else if (cd.getCommand().equals("userlist")) {
					list.setListData(cd.getUserList());
					userList.removeAllElements();
					userList.addAll(cd.getUserList());
				}
			}// end of while

				} catch (Exception ex) {
		}

	}

	private void send(ChatData cd) {
		// TODO Auto-generated method stub

	}
}
